//路由鉴权：项目中的路由能不能被访问的权限的设置（某一个路由什么条件下可以访问）
import router from './router'
//安装引入进度条（pnpm i nprogress)
import nprogress from 'nprogress'
//引入进度条样式
import 'nprogress/nprogress.css'
//在组件外部不能直接引入小仓库，需先引入大仓库
import pinia from './store'
//获取用户相关的小仓库内部token数据，去判断用户是否登录成功
import useUserStore from './store/modules/user'
let userStore = useUserStore(pinia) //要在函数中使用pinia
let username = userStore.username
//全局守卫，项目当中任意路由切换都会触发的钩子
//全局前置守卫
router.beforeEach(async (to: any, from: any, next: any) => {
  //next()路由的放行函数
  nprogress.start()
  //获取token去判断用户是否登录(只有登录成功才能获取到token)
  let token = userStore.token
  if (token) {
    //登录成功，就不能再直接访问login
    if (to.path == '/login') {
      next({ path: '/home' })
    } else {
      //登录成功可直接访问其余六个路由
      //如果有用户信息
      if (username) {
        next()
      } else {
        //如果没有用户信息，在守卫这里发送请求获取到用户信息再放行
        try {
          //获取用户信息
          await userStore.userInfo()
          //如果刷新的时候是异步路由,有可能获取到了用户信息但异步路由还没有加载完毕导致出现空白页。
          next({ ...to }) //在放行函数中添加{...to},可以保证所有信息加载完成再放行
        } catch (error) {
          //token过期：获取不到用户信息
          //用户手动修改本地存储token
          //退出登录->用户相关的数据清空
          userStore.logout()
          next({ path: '/login' })
        }
      }
    }
  } else {
    //未登录时不能直接跳转到其页面
    if (to.path == '/login') {
      next()
    } else {
      next({ path: '/login', query: { redirect: to.path } })
    }
  }
})
//全局后置守卫
router.afterEach((to: any, from: any) => {
  nprogress.done()
})
//问题一：路由鉴权（路由组件访问权限的设置）
//用户未登录只能访问login
//用户登录成功则不可以访问login
